/**
 * MagnetPowerUp - 磁铁道具
 * 自动吸引附近的金币和收集品
 */

import { PowerUp, PowerUpType, PowerUpRarity, type PowerUpConfig, type PowerUpEffect, type PowerUpOptions } from '../PowerUp'
import type { Player } from '../Player'

/**
 * 磁铁效果实现
 */
export class MagnetEffect implements PowerUpEffect {
  // private originalMagnetRange: number = 0
  private magnetRange: number = 150 // 磁铁吸引范围

  /**
   * 应用磁铁效果
   */
  apply(_player: Player): void {
    // 这里可以设置玩家的磁铁属性
    // 由于Player类还没有磁铁相关属性，我们先保存原始状态
    // this.originalMagnetRange = 0 // 假设玩家原本没有磁铁效果
    
    // 在实际实现中，这里会修改玩家的磁铁范围属性
    console.log(`磁铁效果已激活，吸引范围: ${this.magnetRange}px`)
  }

  /**
   * 移除磁铁效果
   */
  remove(_player: Player): void {
    // 恢复玩家的原始磁铁范围
    console.log('磁铁效果已结束')
  }

  /**
   * 更新磁铁效果
   */
  update(_player: Player, _deltaTime: number): void {
    // 这里可以实现磁铁吸引逻辑
    // 在实际游戏中，会检测附近的金币并将它们吸引向玩家
  }

  /**
   * 获取磁铁范围
   */
  getMagnetRange(): number {
    return this.magnetRange
  }
}

/**
 * 磁铁道具类
 */
export class MagnetPowerUp extends PowerUp {
  constructor(options: Omit<PowerUpOptions, 'powerUpType'>) {
    super({
      ...options,
      powerUpType: PowerUpType.MAGNET
    })
  }

  /**
   * 创建磁铁道具配置
   */
  protected createConfig(customConfig?: Partial<PowerUpConfig>): PowerUpConfig {
    const defaultConfig: PowerUpConfig = {
      type: PowerUpType.MAGNET,
      duration: 8000, // 8秒
      value: 150, // 吸引范围
      rarity: PowerUpRarity.COMMON,
      stackable: false,
      maxStacks: 1,
      description: '自动吸引附近的金币和收集品',
      iconColor: '#E91E63' // 粉红色
    }

    return { ...defaultConfig, ...customConfig }
  }

  /**
   * 创建磁铁效果
   */
  protected createDefaultEffect(): PowerUpEffect {
    return new MagnetEffect()
  }

  /**
   * 渲染磁铁道具的特殊效果
   */
  protected renderDefault(ctx: CanvasRenderingContext2D): void {
    // 绘制磁铁形状
    ctx.fillStyle = this.config.iconColor
    
    // 绘制磁铁主体（U形）
    const centerX = 0
    const centerY = 0
    const width = this.width * 0.8
    const height = this.height * 0.8
    
    // 左臂
    ctx.fillRect(centerX - width/2, centerY - height/2, width/4, height)
    // 右臂
    ctx.fillRect(centerX + width/4, centerY - height/2, width/4, height)
    // 底部连接
    ctx.fillRect(centerX - width/2, centerY + height/4, width, height/4)

    // 绘制磁力线效果
    ctx.strokeStyle = '#FF4081'
    ctx.lineWidth = 2
    ctx.setLineDash([2, 2])
    
    // 绘制几条弯曲的磁力线
    for (let i = 0; i < 3; i++) {
      // const offset = (i - 1) * 8
      ctx.beginPath()
      ctx.arc(centerX, centerY - height/4, 15 + i * 5, 0, Math.PI)
      ctx.stroke()
    }
    
    ctx.setLineDash([]) // 重置虚线
  }
}